﻿using Microsoft.ClearScript.V8;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace BarrageGrab
{
    public static class ScriptsExecuter
    {
        public static V8ScriptEngine? InnerJsEngine { get; set; }


        static ScriptsExecuter()
        {
            // 先释放引擎，如果已经存在
            DisposeEngine();

            InnerJsEngine = new V8ScriptEngine("douyinScriptEngine");

            InitJsEngine();
        }

        // 释放引擎资源
        public static void DisposeEngine()
        {
            InnerJsEngine?.Dispose();
            InnerJsEngine = null;
        }

        private static void InitJsEngine()
        {
            var scriptDir = Path.Combine(AppContext.BaseDirectory, "Scripts");

            List<string> fileNames = new List<string> { "dysign.vm.js" };

            foreach (var fileName in fileNames)
            {
                // 读取并执行脚本文件
                using (var reader = new StreamReader($"{scriptDir}\\{fileName}"))
                {
                    InnerJsEngine!.Execute(reader.ReadToEnd());
                }
            }
        }

        internal static string Md5Hex(string input)
        {
            // 将输入字符串转换为字节数组
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);

            // 创建一个 MD5 加密算法实例
            using (MD5 md5 = MD5.Create())
            {
                // 计算 MD5 哈希值
                byte[] hashBytes = md5.ComputeHash(inputBytes);

                // 将字节数组转换为十六进制字符串
                StringBuilder sb = new StringBuilder();
                foreach (byte b in hashBytes)
                {
                    sb.Append(b.ToString("x2"));
                }
                return sb.ToString();
            }
        }

        public static void EnsureEngineInitialized()
        {
            // 先释放引擎，如果已经存在
            DisposeEngine();
            // 如果InnerJsEngine是null，重新初始化
            InnerJsEngine = new V8ScriptEngine("douyinScriptEngine");
            InitJsEngine();
        }

        public static string XBogusFrontierSign(string param)
        {
            try
            {
                var text = ScriptsExecuter.Md5Hex(param);
                Console.WriteLine("这是需要加密的字符串: " + text);  // 添加调试信息

                string js = "window.byted_acrawler.frontierSign({'X-MS-STUB':'" + text + "'})['X-Bogus']";
                ApplicationRuntime.MainForm?.PrintConsole($"[粉丝团]{js} js相关的字符");
                // 重新初始化 InnerJsEngine
                EnsureEngineInitialized();
                // 等待一段时间再继续执行（例如：等待 1 秒）
                Task.Delay(1000).Wait();  // 1000 毫秒 = 1 秒

                object obj = ScriptsExecuter.InnerJsEngine!.Evaluate(js);

                if (obj != null)
                {
                    return obj.ToString()!;
                }
                else
                {
                    return "00000000";
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);  // 打印异常信息
                return ex.Message;
            }
        }

    }
}
